﻿using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Excecoes;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;

namespace LM.Tela.Desktop.Formularios
{
    public partial class frmItemTabelaPreco : FormBase
    {
        public frmItemTabelaPreco()
        {
            InitializeComponent();
            ConfigureKeyDown();
        }

        private void ConfigureKeyDown()
        {
            AdicioneEventEnterToTAB( cbxTabelaPreco );
            AdicioneEventEnterToTAB( txtCodigo );
            AdicioneEventEnterToTAB( cbxTipoVeiculo );
            AdicioneEventEnterToTAB( cbxTipoVaga );
            AdicioneEventEnterToTAB( txtRefPeriodoInicial );
            AdicioneEventEnterToTAB( txtCustoPeriodoInicial );
            AdicioneEventEnterToTAB( txtRefPeriodoAdicional );
            AdicioneEventEnterToTAB( txtCustoPeriodoAdicional );
            AdicioneEventEnterToTAB( cbxDomingo );
            AdicioneEventEnterToTAB( cbxSegunda );
            AdicioneEventEnterToTAB( cbxTerca );
            AdicioneEventEnterToTAB( cbxQuarta );
            AdicioneEventEnterToTAB( cbxQuinta );
            AdicioneEventEnterToTAB( cbxSexta );
            AdicioneEventEnterToTAB( cbxSabado );
            AdicioneEventEnterToTAB( cbxMatutino );
            AdicioneEventEnterToTAB( cbxVespertino );
            AdicioneEventEnterToTAB( cbxNoturno );
        }

        private void btnNovo_Click( object sender, System.EventArgs e )
        {
            PrepareTelaParaNovoRegistro();
        }

        private void btnSalvar_Click( object sender, System.EventArgs e )
        {
            Salvar();
        }

        private void btnExcluir_Click( object sender, System.EventArgs e )
        {
            Excluir();
        }

        private void grdItens_CellDoubleClick( object sender, System.Windows.Forms.DataGridViewCellEventArgs e )
        {
            if ( e.RowIndex < 0 )
                return;

            dynamic itensGrid = ( ( dynamic )grdItens.DataSource )[e.RowIndex];
            var itens = FabricaGenerica.Crie<IServicoItemTabelaDePreco>().Consulte( itensGrid.Codigo );

            txtCodigo.Text = itens.Codigo.ToString( CultureInfo.InvariantCulture );
            HabiliteCamposDaTela( false );

            cbxTabelaPreco.Text = itensGrid.TabelaPreco;
            cbxTipoVeiculo.Text = itensGrid.TipoVeiculo;
            cbxTipoVaga.Text = itensGrid.TipoVaga;
            txtRefPeriodoInicial.Text = itens.PeriodoInicial;
            txtCustoPeriodoInicial.Text = itens.CustoPeriodoInicial.ToString();
            txtRefPeriodoAdicional.Text = itens.PeriodoAdicional;
            txtCustoPeriodoAdicional.Text = itens.CustoPeriodoAdicional.ToString();
            cbxDomingo.Checked = itens.Domingo.Equals( "S" );
            cbxSegunda.Checked = itens.Segunda.Equals( "S" );
            cbxTerca.Checked = itens.Terca.Equals( "S" );
            cbxQuarta.Checked = itens.Quarta.Equals( "S" );
            cbxQuinta.Checked = itens.Quinta.Equals( "S" );
            cbxSexta.Checked = itens.Sexta.Equals( "S" );
            cbxSabado.Checked = itens.Sabado.Equals( "S" );
            cbxMatutino.Checked = itens.Matutino.Equals( "S" );
            cbxVespertino.Checked = itens.Vespertino.Equals( "S" );
            cbxNoturno.Checked = itens.Noturno.Equals( "S" );
        }

        private void PrepareTelaParaNovoRegistro()
        {
            LimpeCamposEdicao();
            CarregueItensJaCadastrados();

            HabiliteCamposDaTela( true );
            txtCodigo.Focus();
        }

        private void HabiliteCamposDaTela( bool habilitar )
        {
            cbxTabelaPreco.Enabled = habilitar;
            txtCodigo.Enabled = habilitar;

            btnExcluir.Enabled = !habilitar;
        }

        private dynamic ObtemItensDaGrid( DtoItemTabelaDePreco itens )
        {
            return new
            {
                Codigo = itens.Codigo,
                TabelaPrecoId = itens.TabelaPrecoId,
                TabelaPreco = itens.TabelaPreco.Nome,
                TipoVeiculoId = itens.TipoVeiculoId,
                TipoVeiculo = itens.TipoVeiculo.Descricao,
                TipoVagaId = itens.TipoVagaId,
                TipoVaga = itens.Vaga.Tipo
            };
        }

        private void CarregueItensJaCadastrados()
        {
            grdItens.AutoGenerateColumns = false;
            grdItens.DataSource = (from x in FabricaGenerica.Crie<IServicoItemTabelaDePreco>().ConsulteTodos()
                                select new
                                {
                                    Codigo = x.Codigo,
                                    TabelaPreco = x.TabelaPreco.Nome,
                                    TipoVeiculo = x.TipoVeiculo.Descricao,
                                    Vaga = x.Vaga.Tipo,
                                    TabelaPrecoId = x.TabelaPrecoId,
                                    TipoVeiculoId = x.TipoVeiculoId,
                                    TipoVagaId = x.TipoVagaId
                                }).ToList();

        }

        private void LimpeCamposEdicao()
        {
            txtCodigo.Text = string.Empty;
            cbxTabelaPreco.SelectedIndex = -1;
            cbxTipoVeiculo.SelectedIndex = -1;
            cbxTipoVaga.SelectedIndex = -1;
            txtRefPeriodoInicial.Text = string.Empty;
            txtCustoPeriodoInicial.Text = string.Empty;
            txtRefPeriodoAdicional.Text = string.Empty;
            txtCustoPeriodoAdicional.Text = string.Empty;
            cbxDomingo.Checked = false;
            cbxSegunda.Checked = false;
            cbxTerca.Checked = false;
            cbxQuarta.Checked = false;
            cbxQuinta.Checked = false;
            cbxSexta.Checked = false;
            cbxSabado.Checked = false;
            cbxMatutino.Checked = false;
            cbxVespertino.Checked = false;
            cbxNoturno.Checked = false;
        }

        private void Salvar()
        {
            ValidaDadosObrigatorio();

            int codigo;
            int.TryParse( txtCodigo.Text, out codigo );

            decimal custoInicial, custoAdicional;
            decimal.TryParse( txtCustoPeriodoInicial.Text, out custoInicial );
            decimal.TryParse( txtCustoPeriodoAdicional.Text, out custoAdicional );

            var itemTabelaPreco = new DtoItemTabelaDePreco
            {
                Codigo = codigo,
                TabelaPrecoId = ( ( DtoTabelaPreco )cbxTabelaPreco.SelectedItem ).Codigo,
                TipoVeiculoId = ( ( DtoTipoDeVeiculo )cbxTipoVeiculo.SelectedItem ).Codigo,
                TipoVagaId = ( ( DtoVaga )cbxTipoVaga.SelectedItem ).Codigo,
                PeriodoInicial = txtRefPeriodoAdicional.Text,
                CustoPeriodoInicial = custoInicial,
                PeriodoAdicional = txtRefPeriodoAdicional.Text,
                CustoPeriodoAdicional = custoAdicional,
                Domingo = cbxDomingo.Checked ? "S" : "N",
                Segunda = cbxSegunda.Checked ? "S" : "N",
                Terca = cbxTerca.Checked ? "S" : "N",
                Quarta = cbxQuarta.Checked ? "S" : "N",
                Quinta = cbxQuinta.Checked ? "S" : "N",
                Sexta = cbxSexta.Checked ? "S" : "N",
                Sabado = cbxSabado.Checked ? "S" : "N",
                Matutino = cbxMatutino.Checked ? "S" : "N",
                Vespertino = cbxVespertino.Checked ? "S" : "N",
                Noturno = cbxNoturno.Checked ? "S" : "N"
            };

            var servicoDeItemTabelaPreco = FabricaGenerica.Crie<IServicoItemTabelaDePreco>();

            if ( EmEdicao() )
                servicoDeItemTabelaPreco.Atualize( itemTabelaPreco );
            else
                servicoDeItemTabelaPreco.Cadastre( itemTabelaPreco );

            PrepareTelaParaNovoRegistro();
        }

        private void ValidaDadosObrigatorio()
        {
            if ( cbxTabelaPreco.SelectedIndex < 0 )
                throw new InconsistenciasException( "Selecione a tabela de preço." );

            if ( cbxTipoVeiculo.SelectedIndex < 0 )
                throw new InconsistenciasException( "Selecione o tipo de veículo." );

            if ( cbxTipoVaga.SelectedIndex < 0 )
                throw new InconsistenciasException( "Selecione o tipo de vaga." );
        }

        private bool EmEdicao()
        {
            return !string.IsNullOrWhiteSpace( txtCodigo.Text ) && txtCodigo.Enabled == false;
        }

        private void Excluir()
        {
            if ( !EmEdicao() )
            {
                this.ExibaInconsistencia( "Item de Tabela de Preço não selecionada para edição." );
                return;
            }

            FabricaGenerica.Crie<IServicoItemTabelaDePreco>().Exclua( int.Parse( txtCodigo.Text ) );
            PrepareTelaParaNovoRegistro();
        }

        private void frmItemTabelaPreco_Load( object sender, System.EventArgs e )
        {
            CarregarTabelaPreco();
            CarregarTipoVeiculo();
            CarregarVaga();
            PrepareTelaParaNovoRegistro();
        }

        private void CarregarVaga()
        {
            AdicionarItemComboBox( cbxTipoVaga, FabricaGenerica.Crie<IServicoDeVaga>().ConsulteTodos(), "Tipo", "Codigo" );
        }

        private void CarregarTipoVeiculo()
        {
            AdicionarItemComboBox( cbxTipoVeiculo, FabricaGenerica.Crie<IServicoTipoVeiculo>().ConsulteTodos(), "Descricao", "Codigo" );
        }

        private void CarregarTabelaPreco()
        {
            AdicionarItemComboBox( cbxTabelaPreco, FabricaGenerica.Crie<IServicoTabelaPreco>().ConsulteTodos(), "Nome", "Codigo" );
        }

        private void AdicionarItemComboBox( ComboBox comboBox, dynamic lista, string valor, string chave )
        {
            comboBox.DataSource = lista;
            comboBox.DisplayMember = valor;
            comboBox.ValueMember = chave;
        }
    }
}
